﻿namespace Busconeitor.BusinessLayer.Utils
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;

    public class WordCleaner
    {
        #region Atributos
        
        private Regex[] _arregloPatronesLimpiar;
        private Regex[] _arregloPatronesFix;
        private static Dictionary<string, string> Replaces1 = new Dictionary<string, string>();
        private static Dictionary<string, string> Replaces_Fix1 = new Dictionary<string, string>();

        private static readonly string[] Replaces = {
            "a", "e", "i", "o", "u", "c", "ñ", ""
        };

        private static readonly string[] ReplacesFix = {
            "á", "é", "Á", "ñ"
        };

        private static WordCleaner Instance = new WordCleaner(); 

        #endregion

        #region Constructores

        private WordCleaner()
        {
            CompilePatrones();
        }

        #endregion

        #region Propiedades

        #endregion        

        #region Metodos

        private void CompilePatrones()
        {
            Replaces1.Add("a", "[âãáàäÂÃÁÀÄ]");
            Replaces1.Add("e", "[éèêëÉÈÊË]");
            Replaces1.Add("i", "[íìîïÍÌÎÏ]");
            Replaces1.Add("o", "[óòôõöÓÒÔÕÖ]");
            Replaces1.Add("u", "[úùûüÚÙÛÜ]");
            Replaces1.Add("c", "[çÇ]");
            Replaces1.Add("ñ", "[ñÑ]");
            Replaces1.Add("", "[^\\wñ]");

            Replaces_Fix1.Add("á", "[Æ]");
            Replaces_Fix1.Add("é", "[Ø]");
            Replaces_Fix1.Add("Á", "[`]");
            Replaces_Fix1.Add("ñ", "[æ]");

            _arregloPatronesLimpiar = new Regex[Replaces1.Count];
            _arregloPatronesLimpiar[0] = new Regex(Replaces1.Values.ElementAt(0), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[1] = new Regex(Replaces1.Values.ElementAt(1), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[2] = new Regex(Replaces1.Values.ElementAt(2), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[3] = new Regex(Replaces1.Values.ElementAt(3), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[4] = new Regex(Replaces1.Values.ElementAt(4), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[5] = new Regex(Replaces1.Values.ElementAt(5), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[6] = new Regex(Replaces1.Values.ElementAt(6), RegexOptions.IgnoreCase);
            _arregloPatronesLimpiar[7] = new Regex(Replaces1.Values.ElementAt(7), RegexOptions.IgnoreCase);

            _arregloPatronesFix = new Regex[ReplacesFix.Length];
            _arregloPatronesFix[0] = new Regex(Replaces_Fix1.Values.ElementAt(0), RegexOptions.IgnoreCase);
            _arregloPatronesFix[1] = new Regex(Replaces_Fix1.Values.ElementAt(1), RegexOptions.IgnoreCase);
            _arregloPatronesFix[2] = new Regex(Replaces_Fix1.Values.ElementAt(2), RegexOptions.IgnoreCase);
            _arregloPatronesFix[3] = new Regex(Replaces_Fix1.Values.ElementAt(3), RegexOptions.IgnoreCase);
        }

        /// <summary>
        /// Corrige una palabra mal parseada por el PDF parser. Mantiene mayúsculas/minúsculas ejemplo:
        /// Real: Cadáver - Parseda: CadÆver - Corregida: Cadáver
        /// </summary>
        /// <param name="word"></param>
        /// <returns></returns>
        public static string FixWrongParsedWord(string word)
        {
            return Instance.FixIntern(word).Trim();
        }

        /// <summary>
        /// Limpia una palabra a solo letras: a-z ó 0-9, los acentos serán removidos y si hay otros simbolos los eliminará.
        /// </summary>
        /// <param name="palabra"></param>
        /// <returns></returns>
        public static string CleanWord(string palabra)
        {
            return Instance.CleanInternWord(palabra);
        }

        private string CleanInternWord(string word)
        {
            var result = word;

            for (var i = 0; i < _arregloPatronesLimpiar.Length; i++)
            {
                var matcher = _arregloPatronesLimpiar[i].Match(result);

                if (matcher.Length > 0)
                    result = result.Replace(matcher.Value, Replaces1.Keys.ElementAt(i));
            }

            return result.ToLower();
        }

        private string FixIntern(string word)
        {
            var resultado = word;

            for (var i = 0; i < _arregloPatronesFix.Length; i++)
            {
                var matcher = _arregloPatronesFix[i].Match(resultado);

                if (matcher.Length > 0)
                    resultado = matcher.Result(ReplacesFix[i]);
            }

            return resultado;
        } 

        #endregion
    }
}
